<?php
/**
 * Created by PhpStorm.
 * User: Administrator
 * Date: 2018/7/20
 * Time: 18:58
 */

namespace Modules\Goods\Service;
use houdunwang\arr\Arr;
use Modules\Goods\Entities\Attr;
use Modules\Goods\Entities\Fenlei;
use Modules\Goods\Entities\FenleiAttr;
use Modules\Goods\Entities\Goods;

class HomeService
{
    //获取多级目录列表数据
    public function getFenlei($fid){
        //获取所有的分类数据
        $fenlei = Fenlei::get()->toArray();
        //获得多级分类的目录列表
        $fenleiList = Arr::channelLevel($fenlei, $fid, "&nbsp;", 'id','pid');
//        dd($fenleiList);

        ###获得多级目录列表（多维数组） 这个方法是后盾网的组件,网站地址 https://github.com/houdunwang/Arr
//      Arr::channelLevel($data, $pid = 0, $html = "&nbsp;", $fieldPri = 'cid', $fieldPid = 'pid')
//      参数                         说明
//      data                      	操作的数组
//      pid                      	父级栏目的 id 值
//      html                     	栏目名称前缀，用于在视图中显示层次感的栏目列表
//      fieldPri                 	唯一键名，如果是表则是表的主键
//      fieldPid                  	父 ID 键名
//


        //获取每个顶级分类下的所有最底层分类的商品
        foreach ($fenleiList as $k => $v){
//            dd($v);
            //$v是每个当前循环的顶级分类的数据,$v['_data']里面是二级分类的数据
            foreach ($v['_data'] as $vv){
                //$vv是每个当前循环的二级分类的数据,$vv['_data']里面是三级分类的数据
                foreach ($vv['_data'] as $vvv){
                    //$vvv是每个当前循环的三级分类的数据
                    //dd($vvv);

                    //去商品表中找到每个最底级分类的商品数据
                    if ($goods = Goods::where('cid','like','%'.$vvv['id'])->first()){
                        $fenleiList[$k]['goods'][] = $goods;
                    }
                }
            }
        }
//        dd($fenleiList);
        return $fenleiList;
    }

////////////////////////////////////////////////////////////////////////////////////

    /**
     * 根据分类的id获取对应分类页的商品数据
     * @param $cid
     * @return array
     */
    public function getListsGoods($cid){
        //获得$cid对应的所有分类数据
        $data=Fenlei::find($cid);
//        dd($data);
        //用$data调用它的父级id(pid)，如果它的父级id等于0，那么就是一级分类，
        //用$data调用Fenlei模型的child方法，可以直接调用属性，就是不带括号，如果存在，那么就是二级分类，
        //不是一级分类，不是二级分类，那么就是三级分类
        if($data->pid==0){
            //把$data里面的id和fname存入$f数组中，以便在lists模板中调用
            $fenleiname=[
                [$data->id, $data->fname]
            ];
            $goods = Goods::where('cid','like',$cid.',%')->get()->toArray();
        }else if($data->child->toArray()){

            $p=Fenlei::find($data['pid']);
            $fenleiname=[
               [ $p->id,$p->fname,],
                [$data->id, $data->fname]
            ];
            $goods = Goods::where('cid','like','%,'.$cid.',%')->get()->toArray();
        }else{

            $p=Fenlei::find($data['pid']);
            $pp=Fenlei::find($p->pid);
            $fenleiname=[
                [$pp->id,$pp->fname],
                [ $p->id,$p->fname,],
                [$data->id, $data->fname]
            ];
            $goods = Goods::where('cid','like','%,'.$cid)->get()->toArray();
        }





//        获得某个id对应的所有分类数据
//        $fenleis = $this->getFenlei($cid);
//        dd($fenleis);
        //对$fnelei进行判断，如果$fenleis是空数组，就说明是最后一级分类
        //如果$fenleis有数据，就循环$fenleis,判断里面的$v下面的_data是否为空,为空的话就代表当前点击的是二级分类，如果$v下面的_data不为空，就说明当前点击的是顶级分类

        //定义一个空数组用来接收商品数据
//            $goods=[];
//        if ($fenleis){
//            foreach ($fenleis as $v){
//                //循环$fenleis，如果$v里面的_data为空，就代表点击的是二级分类
//                if ($v['_data']){
//                    foreach ($v['_data'] as $vv){
//                        $good = Goods::where('cid','like','%'.$vv['id'])->get()->toArray();
////                        dd($good);
//                        //如果$good下面有商品数据，那么才可以放进$goods这个定义的空数组中
//                        if ($good){
//                            foreach ($good as $vvv){
//                                $goods[] = $vvv;
//                            }
//                        }
//                    }
//                }else{
//                    //当前点击的是二级分类
//                    $good = Goods::where('cid','like','%'.$v['id'])->get()->toArray();
//                    if ($good){
//                        foreach ($good as $vvv){
//                            $goods[] = $vvv;
//                        }
//                    }
//                }
//            }
//        }else{
//            //当前点击的是三级分类
//            $good = Goods::where('cid','like','%'.$cid)->get()->toArray();
//            if ($good){
//                foreach ($good as $vvv){
//                    $goods[] = $vvv;
//                }
//            }
//        }
        //最后，将获取到的商品数据返回
        return [$fenleiname,$goods];
    }

////////////////////////////////////////////////////////////////////////////////////

    //根据分类的id获取对应分类页的属性数据
    public function getListsAttrs($cid){
        //获取当前$cid对应的所有分类数据
        $fenleis = $this->getFenlei($cid);
        //判断当前点击的$cid是几级分类

        //定义一个空数组用来接收可用属性
        $listsAttrs = [];
        if ($fenleis){
            foreach ($fenleis as $v){
                if ($v['_data']){
                    foreach ($v['_data'] as $vv){
//                        dd($vv);$vv当前分类里面的商品数据
                        //然后用当前分类的id去找到这个分类的可用属性
                        $attrs = FenleiAttr::where('fenlei_id',$vv['id'])->pluck('attr_id')->toArray();
//                        dd($attrs);
                        $listsAttrs = array_merge($listsAttrs,$attrs);
//                        dd($listsAttrs);
                    }
                }else{
                    //当前点击的是二级分类
                    //然后用当前分类的id去找到这个分类的可用属性
                    $attrs = FenleiAttr::where('fenlei_id',$v['id'])->pluck('attr_id')->toArray();
//                        dd($attrs);
                    $listsAttrs = array_merge($listsAttrs,$attrs);
//                        dd($listsAttrs);
                }
            }
        }else{
//            dd(3);
            //当前点击的是三级分类
            //然后用当前分类的id去找到这个分类的可用属性
            $attrs = FenleiAttr::where('fenlei_id',$cid)->pluck('attr_id')->toArray();
//                        dd($attrs);
            $listsAttrs = array_merge($listsAttrs,$attrs);
//                        dd($listsAttrs);
        }
        //把获取到的可用属性去重
        $listsAttrs  = array_unique($listsAttrs);
//        dd($listsAttrs);
        return $this->getAllAttrs($listsAttrs);
    }

////////////////////////////////////////////////////////////////////////////////////
    /**
     * 根据获取到的可用属性id数组来获取对应的属性数据
     * @param $listsAttrs
     * @return mixed
     */
    public function getAllAttrs($listsAttrs){
        //找到id在$listsAttrs数组中的属性数据，包括每个顶级属性的子属性
        $attrs = Attr::whereIn('id',$listsAttrs)->get()->toArray();
//        dd($attrs);
        //循环$attrs，
        foreach ($attrs as $k=>$v){
            $attrs[$k]['son'] = Attr::where('pid',$v['id'])->get()->toArray();
        }
        //将属性数据返回
        return $attrs;
    }



}